package pe.com.bbva.modpre.ui;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.modpre.dominio.Lista;
import pe.com.bbva.modpre.dominio.Rar;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.negocio.ConfiguracionService;
import pe.com.bbva.modpre.negocio.SolicitudService;
import pe.com.bbva.modpre.utileria.Inject;
import pe.com.bbva.modpre.utileria.ModpreUtil;
import pe.com.bbva.modpre.utileria.TablaFiltro;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.data.util.filter.And;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.SimpleStringFilter;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import com.vaadin.terminal.gwt.server.WebBrowser;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class AdministrarRarUsuarioUI extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout mainLayoutContainer;
	@AutoGenerated
	private VerticalLayout lytRarUsuarioFormulario;
	@AutoGenerated
	private HorizontalLayout lytBotonera;
	@AutoGenerated
	private Button btnRestaurar;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private TextField txtPuntoOptimo;
	@AutoGenerated
	private VerticalLayout lytRarUsuario;
	@AutoGenerated
	private Panel pnlRarUsuario;
	@AutoGenerated
	private VerticalLayout lytPanelRarUsuario;
	@AutoGenerated
	private TablaFiltro tblRarUsuario;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	@Autowired
	ConfiguracionService configuracionService;
	@Autowired
	protected SolicitudService solicitudService;
	
	IndexedContainer container;	
	
	List<Valor> divisas;
	List<Valor> grupoProductos;
	List<Valor> productosHipotecario;
	List<Valor> productosConsumo;
	List<Valor> valorClientesBEC;
	List<Valor> valorClientesMinorista;
	List<Valor> scoreVinculados;
	List<Valor> montoCargasBEC;
	List<Valor> montoCargasHipotecario;
	List<Valor> montoCargasConsumo;
	List<Valor> plazos;
	
	public AdministrarRarUsuarioUI() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		Inject.inject(this);
		postConstruct();
	}
	
	@Override
	public void attach() {
		super.attach();
		WebApplicationContext context = ((WebApplicationContext) getApplication().getContext());
		WebBrowser webBrowser = context.getBrowser();
		tblRarUsuario.setWebBrowser(webBrowser);
		container=new IndexedContainer();

		container.addContainerProperty("tipoCarga", String.class, null);
		container.addContainerProperty("codigoMoneda", String.class, null);
		container.addContainerProperty("codigoGrupoProducto", String.class, null);
		container.addContainerProperty("codigoMonto", String.class, null);
		container.addContainerProperty("valorCliente", String.class, null);
		container.addContainerProperty("scoreVinculado", String.class, null);
		container.addContainerProperty("codigoPlazo", String.class, null);
		container.addContainerProperty("rar", BigDecimal.class, null);
		container.addContainerProperty("puntoOptimo", BigDecimal.class, null);
		container.addContainerProperty("rarObject", Rar.class, null);
		
		tblRarUsuario.setContainerDataSource(container);
		
		tblRarUsuario.setVisibleColumns(new Object[]{"tipoCarga","codigoMoneda","codigoGrupoProducto","codigoMonto",
				"valorCliente","scoreVinculado","codigoPlazo","rar","puntoOptimo"});

		tblRarUsuario.setColumnHeader("tipoCarga", "Tipo Carga");
		tblRarUsuario.setColumnHeader("codigoMoneda", "Moneda");
		tblRarUsuario.setColumnHeader("codigoGrupoProducto", "Producto");
		tblRarUsuario.setColumnHeader("codigoMonto", "Monto");
		tblRarUsuario.setColumnHeader("valorCliente", "Valor Cliente");
		tblRarUsuario.setColumnHeader("scoreVinculado", "Score Vinc.");
		tblRarUsuario.setColumnHeader("codigoPlazo", "Plazo");
		tblRarUsuario.setColumnHeader("rar", "RAR");
		tblRarUsuario.setColumnHeader("puntoOptimo", "Punto Optimo");

		tblRarUsuario.setColumnWidth("tipoCarga", 80);
		tblRarUsuario.setColumnWidth("codigoMoneda", 80);
		tblRarUsuario.setColumnWidth("codigoGrupoProducto", 80);
		tblRarUsuario.setColumnWidth("codigoMonto", 80);
		tblRarUsuario.setColumnWidth("valorCliente", 80);
		tblRarUsuario.setColumnWidth("scoreVinculado", 80);
		tblRarUsuario.setColumnWidth("codigoPlazo", 80);
		tblRarUsuario.setColumnWidth("rar", 80);
		tblRarUsuario.setColumnWidth("puntoOptimo", 80);
		tblRarUsuario.setSelectable(true);
		tblRarUsuario.setImmediate(true);
		tblRarUsuario.setNullSelectionAllowed(true);
		tblRarUsuario.setNullSelectionItemId(null);
		tblRarUsuario.setColumnReorderingAllowed(false);
		tblRarUsuario.setColumnCollapsingAllowed(false);
		tblRarUsuario.cargarTabla();
		tblRarUsuario.addListener(new ValueChangeListener() {
			
			@Override
			public void valueChange(ValueChangeEvent event) {
				if(tblRarUsuario.getValue() == null){
					limpiar();
				}
				else
				{
					btnGuardar.setVisible(true);
					btnRestaurar.setVisible(true);
					Item item = tblRarUsuario.getItem(tblRarUsuario.getValue());
					Rar rar=(Rar)item.getItemProperty("rarObject").getValue();
					txtPuntoOptimo.setValue(rar.getPuntoOptimo());
				}
			}
		});
		cargarDataTabla();
	}

	public void postConstruct(){
		lytPanelRarUsuario.setSizeUndefined();
		lytPanelRarUsuario.setHeight("100%");
		
		txtPuntoOptimo.setNullRepresentation(StringUtils.EMPTY);
		txtPuntoOptimo.setStyleName("decimal");
		
		btnGuardar.addListener(this);
		btnGuardar.setVisible(false);
		btnRestaurar.addListener(this);
		btnRestaurar.setVisible(false);
		
		divisas=configuracionService.obtenerValoresxLista(Lista.CODIGO.DIVISA_CARGA);
		grupoProductos=configuracionService.obtenerValoresxLista(Lista.CODIGO.GRUPO_PROD_CARGA_RAR);
		productosHipotecario=configuracionService.obtenerValoresxLista(Lista.CODIGO.COD_PROD_CARGA_HIPOT);
		productosConsumo=configuracionService.obtenerValoresxLista(Lista.CODIGO.COD_PROD_CARGA_CONSU);
		valorClientesBEC=configuracionService.obtenerValoresxLista(Lista.CODIGO.VAL_CLIENTE_RAR_BEC);
		valorClientesMinorista=configuracionService.obtenerValoresxLista(Lista.CODIGO.VAL_CLIENTE_RAR_MIN);
		scoreVinculados=configuracionService.obtenerValoresxLista(Lista.CODIGO.SCORE_VINCULADO);
		montoCargasBEC=configuracionService.obtenerValoresxLista(Lista.CODIGO.MONTO_CARGA_BEC_RAR);
		montoCargasHipotecario=configuracionService.obtenerValoresxLista(Lista.CODIGO.MONTO_CARGA_HIPO_RAR);
		montoCargasConsumo=configuracionService.obtenerValoresxLista(Lista.CODIGO.MONTO_CARGA_CONSU_RAR);
		plazos=configuracionService.obtenerValoresxLista(Lista.CODIGO.PLAZO_CARGA);
		
	}

	public void cargarDataTabla(){
		tblRarUsuario.removeAllItems();
		
		List<Rar> rars=configuracionService.buscarRar(null);
		
		int con=1;
		for(Rar rar : rars){
			Item item = container.addItem(con);
			item.getItemProperty("tipoCarga").setValue(rar.getTipoCarga().getNombre());
			for (Valor valor : divisas) {
				if(rar.getCodigoMoneda()!=null &&
						rar.getCodigoMoneda().toString().equals(valor.getCodigo())){
					item.getItemProperty("codigoMoneda").setValue(valor.getNombre());
					break;
				}
			}
			if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.BEC_CARGA)){
				for (Valor valor : grupoProductos) {
					if(rar.getCodigoGrupoProducto()!=null &&
							rar.getCodigoGrupoProducto().toString().equals(valor.getCodigo())){
						item.getItemProperty("codigoGrupoProducto").setValue(valor.getNombre());
					}
				}
			}else if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.HIPOTECARIO_CARGA)){
				for (Valor valor : productosHipotecario) {
					if(rar.getCodigoGrupoProducto()!=null &&
							rar.getCodigoGrupoProducto().toString().equals(valor.getCodigo())){
						item.getItemProperty("codigoGrupoProducto").setValue(valor.getNombre());
					}
				}
			}else if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.CONSUMO_CARGA)){
				for (Valor valor : productosConsumo) {
					if(rar.getCodigoGrupoProducto()!=null &&
							rar.getCodigoGrupoProducto().toString().equals(valor.getCodigo())){
						item.getItemProperty("codigoGrupoProducto").setValue(valor.getNombre());
					}
				}
			}
			if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.BEC_CARGA)){
				for (Valor valor : montoCargasBEC) {
					if(rar.getCodigoMonto()!=null &&
							rar.getCodigoMonto().toString().equals(valor.getCodigo())){
						item.getItemProperty("codigoMonto").setValue("Desde " + valor.getAux1() + " a Hasta " + valor.getAux2());
					}
				}
			}else if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.HIPOTECARIO_CARGA)){
				for (Valor valor : montoCargasHipotecario) {
					if(rar.getCodigoMonto()!=null &&
							rar.getCodigoMonto().toString().equals(valor.getCodigo())){
						item.getItemProperty("codigoMonto").setValue(valor.getNombre());
					}
				}
			}else if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.CONSUMO_CARGA)){
				for (Valor valor : montoCargasConsumo) {
					if(rar.getCodigoMonto()!=null &&
							rar.getCodigoMonto().toString().equals(valor.getCodigo())){
						item.getItemProperty("codigoMonto").setValue(valor.getNombre());
					}
				}
			}
			if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.BEC_CARGA)){
				for (Valor valor : valorClientesBEC) {
					if(rar.getValorCliente()!=null &&
							rar.getValorCliente().toString().equals(valor.getCodigo())){
						item.getItemProperty("valorCliente").setValue(valor.getNombre());
					}
				}
			}
			if(rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.HIPOTECARIO_CARGA) || rar.getTipoCarga().getCodigo().equals(Valor.CODIGO.CONSUMO_CARGA)){
				for (Valor valor : valorClientesMinorista) {
					if(rar.getValorCliente()!=null &&
							rar.getValorCliente().toString().equals(valor.getCodigo())){
						item.getItemProperty("valorCliente").setValue(valor.getNombre());
					}
				}
			}
			for (Valor valor : scoreVinculados) {
				if(rar.getScoreVinculado()!=null &&
						rar.getScoreVinculado().toString().equals(valor.getCodigo())){
					item.getItemProperty("scoreVinculado").setValue(valor.getNombre());
				}
			}
			for (Valor valor : plazos) {
				if(rar.getCodigoPlazo()!=null &&
						rar.getCodigoPlazo().toString().equals(valor.getCodigo())){
					item.getItemProperty("codigoPlazo").setValue(valor.getNombre());
				}
			}
			if(rar.getRar()!=null){
				item.getItemProperty("rar").setValue(rar.getRar());
			}else{
				item.getItemProperty("rar").setValue(rar.getRarocPropuesto());
			}
			item.getItemProperty("puntoOptimo").setValue(rar.getPuntoOptimo());
			item.getItemProperty("rarObject").setValue(rar);
			con++;	
		}
	}
	
	public void filtrarDataTabla(Map<String, Object> map){
		container.removeAllContainerFilters();
		if(map!=null){
			List<Filter> filters=new ArrayList<Filter>();
			
			if(StringUtils.isNotBlank((String)map.get("tipoCarga"))){
				filters.add(new SimpleStringFilter("tipoCarga",(String)map.get("tipoCarga"), true, false));
			}
			
			if(StringUtils.isNotBlank((String)map.get("codigoMoneda"))){
				filters.add(new SimpleStringFilter("codigoMoneda",(String)map.get("codigoMoneda"), true, false));
			}
	
			if(StringUtils.isNotBlank((String)map.get("codigoGrupoProducto"))){
				filters.add(new SimpleStringFilter("codigoGrupoProducto",(String)map.get("codigoGrupoProducto"), true, false));
			}
			
			if(StringUtils.isNotBlank((String)map.get("codigoMonto"))){
				filters.add(new SimpleStringFilter("codigoMonto",(String)map.get("codigoMonto"), true, false));
			}
			
			if(StringUtils.isNotBlank((String)map.get("valorCliente"))){
				filters.add(new SimpleStringFilter("valorCliente",(String)map.get("valorCliente"), true, false));
			}
			
			if(StringUtils.isNotBlank((String)map.get("scoreVinculado"))){
				filters.add(new SimpleStringFilter("scoreVinculado",(String)map.get("scoreVinculado"), true, false));
			}
			
			if(StringUtils.isNotBlank((String)map.get("codigoPlazo"))){
				filters.add(new SimpleStringFilter("codigoPlazo",(String)map.get("codigoPlazo"), true, false));
			}
			
			if(NumberUtils.isNumber((String)map.get("rar_1")) && 
					NumberUtils.isNumber((String)map.get("rar_2"))){
				filters.add(new Compare.GreaterOrEqual("rar", ModpreUtil.convertirObjetoBigDecimal(map.get("rar_1"))));
				filters.add(new Compare.LessOrEqual("rar", ModpreUtil.convertirObjetoBigDecimal(map.get("rar_2"))));
			}
			
			if(NumberUtils.isNumber((String)map.get("puntoOptimo_1")) && 
					NumberUtils.isNumber((String)map.get("puntoOptimo_2"))){
				filters.add(new Compare.GreaterOrEqual("puntoOptimo", ModpreUtil.convertirObjetoBigDecimal(map.get("puntoOptimo_1"))));
				filters.add(new Compare.LessOrEqual("puntoOptimo", ModpreUtil.convertirObjetoBigDecimal(map.get("puntoOptimo_2"))));
			}
			
			Filter[] array = filters.toArray(new Filter[filters.size()]);
			Filter filter = new And(array);
			
			container.addContainerFilter(filter);
		}
		
	}
	
	public void limpiar(){
		btnGuardar.setVisible(false);
		btnRestaurar.setVisible(false);
		txtPuntoOptimo.setValue(null);
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar))
		{
			buttonGuardar();
		}
		if(event.getButton().equals(btnRestaurar))
		{
			buttonRestaurar();
		}
	}
	
	private void buttonGuardar() {
		Item item = tblRarUsuario.getItem(tblRarUsuario.getValue());
		Rar rar=(Rar)item.getItemProperty("rarObject").getValue();
		rar.setPuntoOptimo(ModpreUtil.convertirObjetoBigDecimal(txtPuntoOptimo.getValue()));
		configuracionService.guardarRar(rar);
		limpiar();
		cargarDataTabla();
		filtrarDataTabla(null);
	}
	
	private void buttonRestaurar() {
		Item item = tblRarUsuario.getItem(tblRarUsuario.getValue());
		Rar rar=(Rar)item.getItemProperty("rarObject").getValue();
		rar.setPuntoOptimo(rar.getCuartil3());
		configuracionService.guardarRar(rar);
		limpiar();
		cargarDataTabla();
		filtrarDataTabla(null);
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// mainLayoutContainer
		mainLayoutContainer = buildMainLayoutContainer();
		mainLayout.addComponent(mainLayoutContainer);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildMainLayoutContainer() {
		// common part: create layout
		mainLayoutContainer = new HorizontalLayout();
		mainLayoutContainer.setImmediate(false);
		mainLayoutContainer.setWidth("-1px");
		mainLayoutContainer.setHeight("-1px");
		mainLayoutContainer.setMargin(false);
		
		// lytRarUsuario
		lytRarUsuario = buildLytRarUsuario();
		mainLayoutContainer.addComponent(lytRarUsuario);
		
		// lytRarUsuarioFormulario
		lytRarUsuarioFormulario = buildLytRarUsuarioFormulario();
		mainLayoutContainer.addComponent(lytRarUsuarioFormulario);
		
		return mainLayoutContainer;
	}

	@AutoGenerated
	private VerticalLayout buildLytRarUsuario() {
		// common part: create layout
		lytRarUsuario = new VerticalLayout();
		lytRarUsuario.setImmediate(false);
		lytRarUsuario.setWidth("-1px");
		lytRarUsuario.setHeight("-1px");
		lytRarUsuario.setMargin(false);
		
		// pnlRarUsuario
		pnlRarUsuario = buildPnlRarUsuario();
		lytRarUsuario.addComponent(pnlRarUsuario);
		
		return lytRarUsuario;
	}

	@AutoGenerated
	private Panel buildPnlRarUsuario() {
		// common part: create layout
		pnlRarUsuario = new Panel();
		pnlRarUsuario.setImmediate(false);
		pnlRarUsuario.setWidth("750px");
		pnlRarUsuario.setHeight("450px");
		
		// lytPanelRarUsuario
		lytPanelRarUsuario = buildLytPanelRarUsuario();
		pnlRarUsuario.setContent(lytPanelRarUsuario);
		
		return pnlRarUsuario;
	}

	@AutoGenerated
	private VerticalLayout buildLytPanelRarUsuario() {
		// common part: create layout
		lytPanelRarUsuario = new VerticalLayout();
		lytPanelRarUsuario.setImmediate(false);
		lytPanelRarUsuario.setWidth("100.0%");
		lytPanelRarUsuario.setHeight("100.0%");
		lytPanelRarUsuario.setMargin(false);
		
		// tblRarUsuario
		tblRarUsuario = new TablaFiltro(){
			
			@Override
			public void enter() {
				filtrarDataTabla(tblRarUsuario.obtenerFiltros());
			}
			
		};
		tblRarUsuario.setImmediate(false);
		tblRarUsuario.setWidth("100.0%");
		tblRarUsuario.setHeight("100.0%");
		lytPanelRarUsuario.addComponent(tblRarUsuario);
		lytPanelRarUsuario.setExpandRatio(tblRarUsuario, 1.0f);
		
		return lytPanelRarUsuario;
	}

	@AutoGenerated
	private VerticalLayout buildLytRarUsuarioFormulario() {
		// common part: create layout
		lytRarUsuarioFormulario = new VerticalLayout();
		lytRarUsuarioFormulario.setImmediate(false);
		lytRarUsuarioFormulario.setWidth("-1px");
		lytRarUsuarioFormulario.setHeight("-1px");
		lytRarUsuarioFormulario.setMargin(true);
		lytRarUsuarioFormulario.setSpacing(true);
		
		// txtPuntoOptimo
		txtPuntoOptimo = new TextField();
		txtPuntoOptimo.setImmediate(false);
		txtPuntoOptimo.setWidth("200px");
		txtPuntoOptimo.setHeight("-1px");
		txtPuntoOptimo.setInputPrompt("Punto Optimo");
		lytRarUsuarioFormulario.addComponent(txtPuntoOptimo);
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		lytRarUsuarioFormulario.addComponent(lytBotonera);
		
		return lytRarUsuarioFormulario;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new HorizontalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("-1px");
		lytBotonera.setHeight("-1px");
		lytBotonera.setMargin(false);
		lytBotonera.setSpacing(true);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Modificar");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		lytBotonera.addComponent(btnGuardar);
		
		// btnRestaurar
		btnRestaurar = new Button();
		btnRestaurar.setCaption("Restaurar");
		btnRestaurar.setImmediate(true);
		btnRestaurar.setWidth("-1px");
		btnRestaurar.setHeight("-1px");
		lytBotonera.addComponent(btnRestaurar);
		
		return lytBotonera;
	}

}
